package cn.good.yan.t3.p1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 *  3. AOP  - 动态代理 - 案例
 * @author shengren.yan
 * @create 2022-08-01
 */
public class ProxyFactory implements InvocationHandler {

    // 被代理类的接口
    private Object target;

    public void setTarget(Object r){
        this.target = r;
    }

    /**
     * 生产代理类，并返回代理对象
     * 参数：
     *   1.ClassLoader 加载动态生成代理类来加载对象
     *   2.目录对象实现的所有接口的class类型数组
     *   3.设置代理对象实现目标方法对象的过程
     * @return {@link Object}
     */
    public Object getProxy(){
        return Proxy.newProxyInstance(
                this.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                this);
    }

    /**
     * 处理代理实例 - 并返回结果
     * @param proxy  代理对象
     * @param method 需要重写目标对象方法
     * @param args   method方法里的参数
     * @return {@link Object}
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (method.getName().equals("add")) {
            // 打印add 方法，只有add 方法进行打印
            System.out.println(method.getName());
            // 其他的方法
            doA(method.getName());
        }
        // 动态代理本质：使用反射机制实现
        Object obj = method.invoke(target,args);

        System.out.println("动态代码里的逻辑，增加日志记录");
//        doB();
//        doC();
        return obj;

    }


    public void doA(String string){
        System.out.println("中介看房2..." + string);
    }

    public void doB(){
        System.out.println("中介收费2...");
    }

    public void doC(){
        System.out.println("中介签合同2...");
    }

}
